iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
Software Development

闖入DLL的世界 DLL我要進來了哦系列 第 12

# 第十二天:遠程注入DLL

  • 分享至 

  • xImage
  •  

今天是第十二天,之前提到了一下今天實作需要的函數,我們今天就正式遠程注入DLL到exe裡面吧,費話不多說直接開始。

程式碼

exe

首先我們需要一個一直執行不會跑掉的exe檔,因為像是之前使用的只要按MessageBox按確定就會立刻跳掉,所以我想到了一個辦法,就是使用 While(cin>>a) 當數字等於某個的時候才會調用Dll (因為我不會寫C++的按鈕 我就爛!) ,以下是程式碼

#include <windows.h>
#include <iostream>
typedef void (*ccc)();
int main() {
	int b;
	while (std::cin >> b) {
		if (b == 2) {
			HMODULE hmodule = LoadLibrary("Dll5.dll");
			if (hmodule == NULL) {
				MessageBox(NULL, "沒有抓到DLL", "標題", MB_OK);
				return -1;
			}
      
			ccc a = (ccc)GetProcAddress(hmodule, "ccc");
			a();
		}
	}
}

這邊的程式碼就不介紹了我們直接跳到遠端注入Dll的程式碼

遠端注入

#include <Windows.h>
void inject(int PID,char* Path){
	//獲取進程句柄
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
	//申請一個記憶體給Path
	LPVOID Return = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT, PAGE_READWRITE);
	//寫入到VirtualAllocEx申請的記憶體內
	WriteProcessMemory(hProcess, Return, Path, strlen(Path) + 1, NULL);
	//LoadLibrary的函數庫
	HMODULE hModule = LoadLibrary("Kernel32.dll");

	LPTHREAD_START_ROUTINE lpStartAddress = LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "LoadLibraryA"));

	CreateRemoteThread(hProcess, NULL, 0, lpStartAddress,Return, 0, NULL);
	

}
int main() {
	const char* p = "D:\\鐵人賽DLL\\Dll5\\Debug\\Dll5.dll";
	inject(26340, (char*)p);
	return 0;
}

我們先來簡單介紹一下inject裡面有兩個函數(PID,以及Path)

PID

前面我們提到需要一個exe一直開著,所以將exe開著之後到工作管理員的詳細資料去看PID再將他打進去,這邊需要注意幾點,程式每次重開系統分配的PID都不一樣,所以每重開一次注入這邊的PID就需要更改。

Path

這邊是想要注入DLL的路徑,路徑為甚麼要使用兩個\?因為這邊主要是怕compiler讀錯 (如果沒說錯的話) 還望其他大大指點

所以在這裡的exe檔案內就不會有dll5.dll

LoadLibrary

這邊提一下LoadLibrary這個函數是可以使用絕對路徑去呼叫Dll的,也就是說為甚麼許多遊戲都會將dll放在別的地方而不是全部堆在一個地方,這邊我猜想的話應該是使用絕對路徑去索引

結語

今天第一次使用遠程注入DLL,對DLL的理解又更加深入了,最近都好忙忙到沒有時間備稿,每天都要打一篇,來人啊給我一個備稿機器,我們明天見。


上一篇
第十一天:DLL hook是甚麼
下一篇
第十三天:講解注入的程式碼運作機制
系列文
闖入DLL的世界 DLL我要進來了哦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言